#ifndef CORE_H

#define CORE_H 0
//为1时为调试模式，输出大量调试信息
#define DEBUG 0

#include <sys/errno.h>
#include <signal.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <sys/io.h>
#include <dirent.h>
#include "include/const.h"
#include "include/utils.h"
#include "include/file.h"
#include "auth.h"
#include "user.h"
#include "deamon.h"

//配置文件名
#define CONF_FILE "/etc/ftpd.d/ftpd.conf"
//配置文件配置项名称
#define CONF_REQUEST_NUM	7
#define	CONF_ITEM_DELIM		"="
#define ROOT_PATH			"root_path"
#define USER_FILE			"user_file"
#define LOG_PATH			"log_path"
#define CTRL_PORT			"port"
#define DATA_PORT			"data_port"
#define MAX_CLIENT			"max_client"
#define MAX_THREAD			"max_thread"
#define TIME_OUT			"time_out"
#define PID_FILE			"pid_file"
//配置文件行长度
#define CONF_LINE_LEN		255
//命令分隔符
#define CMD_DELIM			" "
//文件名长度
#define	FNAME_LEN			255
//日志消息长度
#define LOG_MSG_LEN			255

//配置文件
typedef struct ConfigFile {
	char root[ROOT_PATH_LEN];
	char user[UFILE_PATH_LEN];
	char logpath[LOG_PATH_LEN];
	char pidfile[FNAME_LEN];
	int port;
	int client;
	int thread;
	int timeout;
} config,*config_ptr;
config conf;
config_ptr conf_ptr = &conf;
//服务器端控制链接套接字
static int serv_sock = -1;
//服务器端数据连接套接字
static int data_sock = -1;
//基于epoll的边缘触发
struct epoll_event *ep_events = NULL;
//已认证Socket列表
auth_ptr auth_list = NULL;
//配置文件中用户信息
user_ptr user_list = NULL;
//监视的例程
static int epfd = -1;
//服务器根目录路径长度
static int rlen = -1;
//写日志文件流
FILE *logfp = NULL;
//日志文件名
char logfile[FNAME_LEN] = {0};

//加载配置文件
bool load_config(char *fname);
//加载用户列表
bool load_user(char *fname);
//设置非阻塞模式
bool set_nonblock_mode(int clnt_sock);
//设置SO_REUSEADDR选项(服务器快速重启)
void quick_restart(int serv_sock);
//初始化epoll池
void epoll_init(int cnt_max);
//注册按下Ctrl+C时的处理函数，用于回收系统资源
void key_control_c_register();
//当服务器端套接字发生变化时，用来处理客户端
void server_handler(int serv_sock);
//客户端套接字发生变化时用来处理客户端请求(认证，剔除客户端及数据传输)
void *client_handler(void *para);
//回收资源
void server_resource_revoke();
//执行shell命令并以流的形式发送给客户端
void shell_exec_stream(char *sh, FILE *fp);
//获取当前日志文件名
void get_cur_log_file(char *logname);
//设置日志文件名
void set_cur_log_file();
//写入日志文件
void set_log_to_file(char *info);
//加锁与释放锁
void set_locked(pthread_mutex_t *mutex);
void set_unlocked(pthread_mutex_t *mutex);

#endif
